package trabalho_codificacao_real;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 *
 * @author Guilherme
 */
public class Principal {

    private int quant_interacoes = 100;
    private int num_execucoes = 5;    
    private int numero_ind = 10;
    private int numero_mutacoes = 5;    

    public Principal() {
        CodificacaoReal cr = new CodificacaoReal();
        List<List<Double>> resultados = new ArrayList();
        for (int a = 0; a < num_execucoes; a++) {
            List<Double> melhor_por_interacao = new ArrayList();
            for (int i = 0; i < quant_interacoes; i++) {
                //Muta 5 melhores
                for (int j = 0; j < numero_mutacoes; j++) {
                    cr.mutarIndividuo(cr.getIndividuo(j));
                }
                //Remove os 5 piores
                for (int j = numero_mutacoes; j < numero_ind; j++) {
                    cr.removeIndividuo(numero_mutacoes);
                }
                //Adiciona 5 novos
                for (int j = 0; j < numero_mutacoes; j++) {
                    cr.gerarNovoIndividuo();
                }
                //
                melhor_por_interacao.add(cr.getIndividuo(0).getFitness());
                //
                cr.printPopulação(i);
            }
            resultados.add(melhor_por_interacao);
        }
        this.plotarGrafico(resultados);    
    }
    
    private void plotarGrafico(List resultados) {
        CategoryDataset ds = new DefaultCategoryDataset();
        for (int x = 0; x < resultados.size(); x++) {
            List<Double> resultado = (List<Double>) resultados.get(x);
            for (int i = 0; i < resultado.size(); i++) {
                ((DefaultCategoryDataset) ds).addValue(resultado.get(i), "Melhor" + x, "" + i);
            }
        }
        JFreeChart grafico = ChartFactory.createLineChart("Gráfico Melhores por interação", "Interação", "Valor", ds, PlotOrientation.VERTICAL, true, true, false);
        JFrame frame = new JFrame("Gráfico para " + resultados.size() + " pontos");
        frame.add(new ChartPanel(grafico));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Principal();
    }

}
